#include "Element.h"
#include "SeqQueue.h"


/**
 * 初始化队列
 * @param seqQueue
 */
void InitSeqQue(SeqQueue *seqQueue) {
    /* 如果队列为空 分配空间 */
    if (seqQueue == NULL) {
        seqQueue = (SeqQueue *) malloc(sizeof(SeqQueue));
    }

    seqQueue->length = 0;
    seqQueue->front = 0;
    seqQueue->rear = 0;

}


/**
 * 判断队列是否为空
 * @param seqQueue
 * @return 返回 TRUE | FALSE
 */
State IsSeqQueueEmpty(SeqQueue *seqQueue) {
/* 队头指针如果与对尾指针相同，队列则为空 */
    return seqQueue->front == seqQueue->rear ? TRUE : FALSE;
}

/**
 * 判断队列是否已满
 * @param seqQueue
 * @return 返回 TRUE | FALSE
 */
State IsSeqQueFull(SeqQueue *seqQueue) {
    if ((seqQueue->rear + 1) % MAX_SIZE == seqQueue->front) {
        return TRUE;
    }
    return FALSE;
}


/**
 * 入队操作
 * @param seqQueue
 * @param element
 * @return 返回 TRUE | FALSE
 */
State EnterSeqQueue(SeqQueue *seqQueue, ElementTypes element) {
    /* 判断队列是否已经满了 */
    if (IsSeqQueFull(seqQueue)) {
        /* 返回状态 -1 代表队列已满,入队失败 */
        return STATE_FAIL;
    }
    /* 队尾指针移项下一个元素 data[0] 插入元素 */
    seqQueue->data[seqQueue->rear] = element;
    /* 循环队列 */
    seqQueue->rear = (seqQueue->rear + 1) % MAX_SIZE;
    seqQueue->length++;
    return STATE_OK;
}

/**
 * 出队操作
 * @param seqQueue
 * @param element
 * @return 返回 TRUE | FALSE
 */
State OutSeqQueue(SeqQueue *seqQueue, ElementTypes *element) {
    if (IsSeqQueueEmpty(seqQueue)) {
        return STATE_FAIL;
    }
    /* 出队: 先取出对头元素 */
    *element = seqQueue->data[seqQueue->front];
    seqQueue->front = (seqQueue->front + 1) % MAX_SIZE;
    seqQueue->length--;
    return STATE_OK;
}

int GetHead(SeqQueue *Q, ElementTypes *element)//取对头元素
{
    if (Q->front == Q->rear)
        return FALSE;
    *element = Q->data[Q->front];
    return TRUE;

}